#####
#Roundabout de-make
#don't hit the walls
#do hit the goal
#don't hit the text telling you where the goal is
#####
:const goalx 100
:const goaly 32

:alias  right v5
:alias  down v4
:alias  left v3
:alias up v2
:alias steptimer vA
:alias timercomp vB
:alias x v6
:alias y v7
:alias animframe v0
:alias anitimer v1
:alias leveltimer v8
:alias leveltimerseconds v9
:alias leveltimerminutes vC
:alias health vD

#####
#main
#####
: main
	hires
	check-zero-flags
	draw-title
	start-loop
	v0 := key
: reset
	clear
	draw-world
	
	ve := goalx
	vb := goaly	
	i := goal
	sprite ve vb 7

	right := 9
	down := 8
	left := 7
	up := 5

	y := 5
	x := 4
	health := 4

	anitimer := 0
	animframe := 0
	leveltimer := 0
	leveltimerseconds := 0
	leveltimerminutes := 0
	steptimer := 6
	:const timerinc 10 
	i := car1
	sprite x y 8
	loop
		loop
			timercomp := delay
			if timercomp != 0 then
		again
		delay := steptimer	

		sprite x y 8 #clear
		if right key then x += 1
		if left key then x += -1
		if up key then y += -1
		if down key then y += 1
		i := car1
	
		i += animframe
		sprite x y 8 #draw
		if vf != 0 then jump hit : hitreturn
		anitimer += 1
		if anitimer == 4 then
			animframe += 8
		if anitimer == 4 then anitimer := 0
		if animframe == 64 then animframe := 0
		timer-step
	again

: hit
	ve := goalx
	vb := goaly
	i := goal
	sprite ve vb 7
	sprite ve vb 7
	if vf != 0 then jump winscreen
	ve := 15
	buzzer := ve
	delay := ve
	i := car1
	i += animframe
	loop
		ve := delay
		if ve != 0 then
	again
	health += -1
	if health != 0 then
		jump hitreturn
	ve := 20
	delay := ve
	jump reset
: timer-step
		leveltimer += timerinc
		if leveltimer != 100 then return 
		leveltimerseconds += 1
		leveltimer := 0
		if leveltimerseconds != 60 then return
		leveltimerminutes += 1
		leveltimerseconds := 0
;
######
#game over screen
######
: winscreen	
	
	x := 126
	y := 10
	clear
	draw-time
	
	y += -6
	i := TI
	sprite x y 5
	x += 8
	i := ME
	sprite x y 5
	
	loadflags v2
	
	v0 ^= leveltimerminutes
	leveltimerminutes ^= v0
	v0 ^= leveltimerminutes
	v1 ^= leveltimerseconds
	leveltimerseconds ^= v1
	v1 ^= leveltimerseconds
	v2 ^= leveltimer
	leveltimer ^= v2
	v2 ^= leveltimer

	check-new-highscore

	y := 30
	x := 126
	draw-time
	y += -6
	i := PB
	sprite x y 5
	v1 := 255
	delay := v1
	loop
		v1 := delay
		if v1 != 0
		then 
	again
	desert-limo
	v1 := 40
	delay := v1
	loop
		v1 := delay
		if v1 != 0
		then
	again
	vf := key
jump main
	
: draw-time
	
	i := data
	bcd leveltimer
	draw-bcd
	x += -4
	i := period
	sprite x y 10
	i := data
	bcd leveltimerseconds
	draw-bcd
	x += -4
	i := colon
	sprite x y 10
	i := data
	bcd leveltimerminutes
	draw-bcd
;

: check-new-highscore
	if v0 < leveltimerminutes then jump newhighscore
	if v0 > leveltimerminutes then return
	if v1 < leveltimerseconds then jump newhighscore
	if v1 > leveltimerminutes then return
	if v2 < leveltimer then jump newhighscore
;
: newhighscore
	saveflags v2
;
	

	
;
: draw-bcd
	load v2
	x += -10
	i := bighex v2
	sprite x y 10
	i := bighex v1
	x += -10
	sprite x y 10
;

: desert-limo
	:alias biastimer vE
	:alias bias v4
	:alias rockY vD
	:alias limoX v5
	
	biastimer := 0
	bias := 1
	leveltimer := 0
	leveltimerseconds := 0
	leveltimerminutes := 0
	limoX := 30
	
	x := 10
	y := 0

	i := car5
	#draw road
	loop
		sprite x y 8
		y += 8
		if y != 64 then
	again	
	x := 40
	y := 0
	loop
		sprite x y 8
		y += 8
		if y != 64 then
	again
	
	v0 := 50
	i := rock-init
	sprite v0 rockY 5

	i := car5
	v0 := 50
	sprite limoX v0 8
	x :=  126
	y := 50
	draw-time
	#game loop
	loop
		
		loop
			timercomp := delay
			if timercomp != 0 then
		again
		delay := steptimer
		
		i := car5
		v0 := 50
		sprite limoX v0 8
		
		biastimer += 1
		if biastimer == 10
			then limoX += bias
		if biastimer == 10
			then biastimer := 0
		v0 := 7
		if v0 key then limoX += -1
		v0 := 9
		if v0 key then limoX += 1
		
		i := car5
		v0 := 50
		sprite limoX v0 8
		if vf != 0 then return
	
		x :=  126
		draw-time #clear
		timer-step
		x :=  126
		#yes there's a faster way to do this
		draw-time # draw
		rockY += 1
		v0 := 50
		i := rock
		sprite v0 rockY 5

	again
;

######
#Title
######
: draw-title
	v3 := 8
	v4 := 9
	v5 := 32
	i := roundtitle
	loop #title
		sprite v3 v4 0
		i += v5
		v3 += 16
		if v3 != 120 then
	again
	
	v4 += 19
	v3 := 47
	v5 := 11
	loop #subtitle
		sprite v3 v4 11
		i += v5
		v3 += 8
		if v3 != 79 then
	again
	v4 += 23
: draw-start
	v4 := 51
	v3 := 40
	v5 := 10
	loop #press start
		sprite v3 v4 10
		i += v5
		v3 += 8
		if v3 != 88 then
	again
;
: start-loop
	
	v0 := 90
	delay := v0
	loop
		v1 := delay	
		i := pressstart2
		if v1 == 0 then draw-start
		if v1 == 0 then delay := v0
		v2 := 5
		if v2 key then return
		v2 := 7
		if v2 key then return
		v2 := 8
		if v2 key then return
		v2 := 9
		if v2 key then return
	again
;
: check-zero-flags
	loadflags v2
	if v0 != 0 then return
	if v1 != 0 then return
	if v2 != 0 then return
	v0 := 99
	v1 := 99
	v2 := 99
	saveflags v2
;
: draw-world

    v3 := 0  # x
    v4 := 0   # y
    v5 := 32   # stride
    i := roundaboutworld
    loop
        sprite v3 v4 0
        i  += v5
        v3 += 16
        if v3 == 128 then v4 +=  16
        if v3 == 128 then v3 := 0
        if v4 != 64 then
    again
	;
#######
# Sprites
#######
: car1 #horizontal
	0x00 0x00 0x00 0xff 0xff 0x00 0x00 0x00 

: car2
	0x00 0x00 0x70 0x3E 0x07 0x00 0x00 0x00

: car3 #45 degrees se
	0x00 0x20 0x30 0x18 0x0C 0x6 0x00 0x00
: car4
	
	0x10 0x18 0x18 0x08 0x0C 0x0C 0x04 0x00
: car5 #vertical
	0x18 0x18 0x18 0x18 0x18 0x18 0x18 0x18
: car6
	0x00 0x04 0x0C 0x0C 0x08 0x18 0x18 0x10
: car7 #45 degrees ne
	0x00 0x00 0x06 0x0C 0x18 0x30 0x20 0x00
: car8
	0x00 0x00 0x00 0x07 0x3E 0x70 0x00 0x00 
: period
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
: colon
	0xC0 0xC0 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 0xC0
: goal
	0x38 0x6C 0xC6 0x92 0xC6 0x6C 0x38
: PB
	0xEC 0xAA 0xEC 0x8A 0x8C 
: TI
	0xEA 0x4B 0x4A 0x4A 0x4A  
: ME
	0x2E 0x68 0xAC 0x28 0x2E 
: rock-init
	0x00 0x40 0xA0 0x90 0xF0
: rock	
	0x40 0xE0 0x30 0x60 0xF0

#######
# Images
#######
: roundaboutworld # (1024 bytes)
	0xFF 0xFF 0xFE 0x00 0xF0 0x00 0xE0 0x00
	0xE0 0x00 0xE0 0x00 0xC0 0x00 0xC0 0x00
	0xC0 0x00 0xC0 0x00 0xC0 0x00 0xC0 0x00
	0xC0 0x00 0xC0 0x00 0xE0 0x00 0xE0 0x00
	0xFF 0xFF 0x00 0x00 0x00 0x01 0x00 0x01
	0x00 0x01 0x00 0x01 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0xC0 0x01 0xC0 0x01
	0xFF 0xFF 0x00 0x00 0x80 0x00 0x80 0x00
	0x80 0x00 0x80 0x00 0x00 0x00 0x00 0x00
	0x00 0x01 0x00 0x03 0x00 0x03 0x00 0x03
	0x00 0x03 0x00 0x01 0x80 0x00 0x80 0x00
	0xFF 0xFF 0x00 0x03 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x78 0x00 0xFC 0x00
	0xFE 0x00 0xFF 0x00 0xFF 0x00 0xFF 0x00
	0xFF 0x00 0xFE 0x00 0xFC 0x00 0x78 0x00
	0xFF 0xFF 0xFF 0x00 0xFC 0x00 0x78 0x00
	0x78 0x00 0x30 0x00 0x30 0x00 0x30 0x00
	0x30 0x00 0x30 0x00 0x30 0x00 0x30 0x00
	0x30 0x00 0x30 0x00 0x30 0x00 0x30 0x00
	0xFF 0xFF 0x1F 0xFF 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x30 0x00 0x30 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x01 0x83 0x01 0x83 0x01 0x80 0x01 0x80
	0xFF 0xFF 0xFF 0xC0 0x0F 0x00 0x07 0x00
	0x06 0x00 0xC6 0x00 0xC6 0x00 0x06 0x00
	0x06 0x00 0x00 0x1F 0x00 0x1F 0x00 0x1F
	0x00 0x1F 0x00 0x1F 0x00 0x00 0x00 0x00
	0xFF 0xFF 0x3F 0xFF 0x01 0xFF 0x00 0x0F
	0x00 0x07 0x00 0x07 0x00 0x07 0x00 0x07
	0x00 0x03 0x0C 0x03 0x0C 0x03 0x0C 0x03
	0x0C 0x03 0x0D 0x81 0x0D 0x81 0x0D 0x81
	0xE0 0x00 0xF0 0x00 0xFE 0x00 0xFF 0xFF
	0xFF 0xFF 0xFF 0xFF 0xFF 0xFC 0xFF 0xF0
	0xFF 0xC0 0xFF 0x80 0xFF 0x00 0xFE 0x00
	0xFC 0x00 0xF8 0x30 0xF0 0x30 0xF0 0x00
	0xC0 0x01 0xC0 0x01 0x00 0x00 0xFF 0xFF
	0xFF 0xFF 0x80 0x3F 0x00 0x07 0x00 0x01
	0x00 0x00 0x06 0x00 0x06 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x80 0x00 0x80 0x00 0x00 0x00 0xFF 0xFC
	0xFF 0xFC 0xFF 0xFC 0xFF 0xFC 0xFF 0xFC
	0x7F 0xFC 0x3F 0xFC 0x1F 0xFC 0x0F 0xFC
	0x07 0xFC 0x03 0xFC 0x01 0xFC 0x01 0xFC
	0x00 0x00 0x00 0x00 0x00 0x00 0x30 0x00
	0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x30 0x00 0x30 0x00 0x00 0x00 0x00
	0x30 0x00 0x30 0x00 0x00 0x00 0x00 0x00
	0x30 0x00 0x30 0x00 0x30 0x00 0x30 0x00
	0x30 0x00 0x30 0x00 0x30 0x00 0x30 0x01
	0x30 0x00 0x30 0x00 0x30 0x00 0x30 0x00
	0x30 0x00 0x3F 0xF0 0x30 0x00 0x30 0x00
	0x01 0x80 0x01 0x80 0x01 0x80 0x01 0xFF
	0x01 0xFF 0x01 0xFC 0x01 0xE0 0xFF 0xC0
	0x01 0xC0 0x01 0xC0 0x01 0x80 0x01 0x80
	0x01 0x80 0x01 0x80 0x01 0x80 0x01 0x80
	0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0xFF
	0xFF 0xFF 0x00 0x01 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x01 0xF8
	0x07 0xF8 0x0F 0x8C 0x1C 0x06 0x38 0x06
	0x0D 0x81 0x0D 0x81 0x0C 0x01 0xFC 0x01
	0xFC 0x01 0xFC 0x01 0x3C 0x01 0x0C 0x01
	0x0D 0x81 0x0D 0x81 0x0D 0x81 0x0D 0x81
	0x0D 0x81 0x0D 0x81 0x0C 0x01 0x0C 0x01
	0xE0 0x00 0xE0 0x00 0xC0 0x01 0xC0 0x02
	0xC0 0x05 0x80 0x0B 0x80 0x0B 0x80 0x17
	0x80 0x17 0x86 0x17 0x86 0x17 0x80 0x17
	0x80 0x17 0x80 0x0B 0xC0 0x0B 0xC0 0x05
	0x3F 0x00 0xC0 0xC0 0x3F 0x20 0xFF 0xD0
	0xFF 0xE8 0xFF 0xF4 0xF3 0xF4 0xE1 0xF6
	0xC0 0xFA 0x8C 0x7A 0x8C 0x7A 0xC0 0xFB
	0xE1 0xF7 0xF3 0xF4 0xFF 0xF4 0xFF 0xE8
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0xFF
	0xFF 0xFF 0x01 0xFF 0x00 0x01 0x00 0x00
	0x00 0x00 0x00 0x30 0x00 0x30 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0xFF
	0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x7F 0xF8
	0x30 0x00 0x30 0x00 0x30 0x00 0x30 0x01
	0x30 0x00 0x30 0x00 0x30 0x00 0x30 0x00
	0x30 0x00 0x7F 0xF0 0xF8 0x00 0xF8 0x00
	0xF8 0x00 0xF0 0x00 0x80 0x00 0x00 0x00
	0x01 0x80 0x01 0x80 0x01 0x81 0xFF 0x81
	0x01 0x81 0x01 0x81 0x01 0x83 0x01 0x83
	0x01 0x83 0x01 0x83 0x01 0x83 0x01 0x83
	0x01 0x83 0x01 0x83 0x01 0x81 0x01 0x81
	0x70 0x06 0xE0 0x04 0xC0 0x04 0xC0 0x00
	0xC0 0x00 0x80 0x00 0x80 0x00 0x00 0x00
	0x00 0x00 0x01 0x00 0x03 0x80 0x05 0x40
	0x01 0x00 0x81 0x00 0x81 0x00 0x84 0x44
	0x0C 0x01 0x0C 0x01 0x0C 0x01 0x0C 0x01
	0x0D 0x81 0x0D 0x81 0x0D 0x81 0x0D 0x81
	0x0D 0x81 0x0D 0x81 0x0C 0x01 0x0C 0x01
	0x0C 0x01 0x0C 0x01 0x9C 0x01 0x9D 0x81
	0xC0 0x02 0xE0 0x01 0xE0 0x00 0xF0 0x00
	0xF0 0x30 0xF8 0x30 0xFC 0x00 0xFE 0x00
	0xFF 0x00 0xFF 0x80 0xFF 0xC0 0xFF 0xF0
	0xFF 0xFC 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
	0xFF 0xD0 0x1E 0x20 0xE1 0xC0 0x3F 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x06 0x00 0x06 0x00 0x00 0x00
	0x00 0x00 0x80 0x00 0xFF 0xFF 0xFF 0xFF
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x0F
	0x00 0x1F 0x00 0x3F 0x00 0x7F 0x00 0x7F
	0x00 0xFF 0x01 0xFF 0x87 0xFF 0xFF 0xFF
	0x3F 0xF0 0x3F 0xF0 0x1F 0xE0 0x0F 0xC0
	0x07 0x80 0x00 0x00 0x00 0x00 0x00 0x01
	0x80 0x03 0xC0 0x07 0xE0 0x0F 0xE0 0x0F
	0xF0 0x0F 0xF0 0x1F 0xF8 0x3F 0xFF 0xFF
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0xE0 0x00
	0xF0 0x00 0xF8 0x00 0xFC 0x00 0xFC 0x00
	0xFE 0x00 0xFF 0x80 0xFF 0xF0 0xFF 0xFF
	0x01 0x81 0x01 0x81 0x01 0x80 0x03 0x80
	0x03 0x80 0x03 0x80 0x03 0x80 0x03 0x80
	0x03 0x80 0x07 0x80 0x07 0xC0 0x07 0xC0
	0x07 0xC0 0x0F 0xE0 0x7F 0xFC 0xFF 0xFF
	0x8A 0xAA 0xC6 0x46 0x42 0x00 0x74 0x00
	0x38 0x00 0x1C 0x03 0x0E 0x07 0x07 0xFF
	0x01 0xFC 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0xFF
	0x9D 0x81 0x9D 0x81 0x39 0x81 0x79 0x81
	0xE0 0x01 0xC0 0x01 0x80 0x01 0x00 0x01
	0x00 0x01 0x00 0x01 0x00 0x01 0x00 0x03
	0x00 0x03 0x00 0x07 0x00 0x1F 0xFF 0xFF
	
: roundtitle # (224 bytes)
	0x3F 0xFF 0x20 0x00 0x20 0x20 0x38 0x3F
	0x18 0x1F 0x08 0x1F 0x04 0x1F 0x04 0x1F
	0x04 0x1F 0x04 0x0F 0x02 0x0F 0x02 0x0F
	0x03 0xFF 0x01 0xFF 0x00 0xFF 0x00 0x7F
	0xFF 0xFF 0xC1 0x06 0xC1 0x06 0xC1 0x06
	0xC1 0x06 0xC1 0x06 0xC1 0x06 0xC1 0x06
	0xC1 0x06 0xC0 0x06 0xE0 0x06 0xF8 0x06
	0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
	0xFF 0xC7 0x00 0x3C 0x00 0x1C 0x01 0x0C
	0x03 0x0C 0x02 0x0C 0x06 0x0C 0x04 0x1C
	0x0C 0x3C 0x08 0x7C 0x08 0x0C 0x08 0x0C
	0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
	0xFF 0xCF 0x08 0x70 0x08 0x60 0x04 0x60
	0x04 0x60 0x02 0x60 0x82 0x60 0x80 0x60
	0x40 0x60 0x40 0x60 0x20 0x60 0x20 0x70
	0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
	0xF9 0xFF 0x07 0x04 0x03 0x04 0x83 0x04
	0x83 0x04 0x83 0x04 0x83 0x04 0x83 0x04
	0x03 0x04 0x03 0x00 0x03 0x00 0x07 0x00
	0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
	0xF1 0xFF 0x1E 0x03 0x1C 0x03 0x1C 0xFF
	0x1C 0x03 0x18 0x03 0x18 0x03 0x18 0xFF
	0x18 0x03 0x18 0x03 0x3C 0x03 0xFE 0x03
	0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
	0xFF 0xE0 0x00 0x10 0x00 0x08 0x00 0x84
	0x01 0x84 0x01 0x04 0x03 0x04 0x02 0x08
	0x06 0x10 0x04 0x3C 0x04 0x04 0x04 0x04
	0xFF 0xFC 0xFF 0xF8 0xFF 0xF0 0xFF 0xE0

: seventyseven # (44 bytes)
	0x77 0xA4 0xE7 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0xFF 0x00 0xE0 0x21 0x21
	0x41 0x42 0x42 0x82 0x82 0xFC 0xFF 0x40
	0xFE 0x02 0x02 0x04 0x04 0x04 0x08 0x08
	0x0F 0xFC 0x04 0x08 0x10 0x10 0x10 0x20
	0x20 0x20 0x20 0xC0 
: pressstart # (60 bytes)
	0x1F 0x7F 0x71 0x75 0x75 0x75 0x71 0x77
	0x7F 0x1F 0xFF 0xFF 0x11 0x57 0x57 0x53
	0x37 0x51 0xFF 0xFF 0xFF 0xFF 0x99 0x77
	0x77 0xBB 0xDD 0x33 0xFF 0xFF 0xFF 0xFF
	0xE4 0xDE 0xDE 0xEE 0xF6 0xCE 0xFF 0xFF
	0xFF 0xFF 0x6C 0xD5 0xD5 0xD5 0xC4 0xD5
	0xFF 0xFF 0xF8 0xFE 0xC6 0x6E 0x6E 0x6E
	0xEE 0x6E 0xFE 0xF8 
: pressstart2 # (60 bytes)
	0x00 0x0F 0x3F 0x3F 0x3F 0x3F 0x3F 0x3F
	0x0F 0x00 0x00 0xFF 0xFF 0xFF 0xFF 0xFF
	0xFF 0xFF 0xFF 0x00 0x00 0xFF 0xFF 0xFF
	0xFF 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0xFF
	0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00
	0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
	0xFF 0x00 0x00 0xF0 0xFC 0xFC 0xFC 0xFC
	0xFC 0xFC 0xF0 0x00 


	: data